www.gusucode.com > VC 3D弹道仿真程序源码文件-源码程序 > VC 3D弹道仿真程序源码文件-源码程序/code/Atmosphere.cpp

    #include "stdafx.h"
#include "Atmosphere.h"
//Download by http://www.NewXing.com

CAtmosphere::CAtmosphere()
{
	g0=9.806;
	Ty0=288.15;
	Rz=6371000;
}

CAtmosphere::~CAtmosphere()
{
}

///////////   空军标准大气条件   //////////
//求空军标准大气条件下空气密度 函数
double CAtmosphere::Get_rho_Airforce( double y )  //空军标准大气条件
{   
	rho0=1.225; 
    rho=rho0*pow( 1-2.0323*y/100000, 4.830 );
   
    return rho;
}

//求空军标准大气条件下声速 函数
double CAtmosphere::GetSONIC_Airforce(double y)
{	
	if ( ( y>=0 )&&( y<=13000) )
	{
		Ty=288.34*(1-2.0323e-5*y);    	
		SONIC=20.046*sqrt( Ty );
	}
	if ( y>=13000 )
	{
		Ty=212.2;    	
		SONIC=20.046*sqrt( Ty );
	}

	return SONIC;
}

//求空军标准大气条件下马赫数 函数
double CAtmosphere::GetMa_Airforce(double velo, double y)
{
	return velo/GetSONIC_Airforce( y );
}

///////////   炮兵标准大气条件   //////////
//求炮兵标准大气条件下空气密度 函数
double CAtmosphere::Get_rho_Artillery(double y)   //炮兵标准大气条件  30公里以上按30公里来算,韩子鹏<<火箭外弹道学>>
{
    rho0 = 1.2063;
    double pi_y;
	if ( ( y>=0 )&&( y<9300) )
	{
		Ty=288.9-0.006328*y;
		pi_y=pow( (1-0.000021904*y), 5.4 );
		rho=rho0*pi_y*288.9/Ty;

	}

	else if ( ( y>=9300)&&( y<12000) )
	{
		Ty=230-0.006328*(y-9300)+0.000001172*(y-9300)*(y-9300);
		pi_y=0.2922575*exp( -2.1206426* (atan( (2.344*(y-9300)-6328)/32221.057 )+0.1939252 ) );
		rho=rho0*pi_y*288.9/Ty;
	}
		else
		{
			Ty=221.5;
			pi_y=0.193725*exp(-(y-12000)/6483.305 );
			rho=rho0*pi_y*288.9/Ty;
		}
  return rho;
}
//求炮兵标准大气条件下声速 函数
double CAtmosphere::GetSONIC_Artillery(double y)
{
	double Tyy;
	if ( ( y>=0 )&&( y<=9300) )
	{
		Tyy=288.9-0.006328*y;
	}

	else if ( ( y>9300)&&( y<12000) )
	{
		Tyy=230-0.006328*(y-9300)+0.000001172*(y-9300)*(y-9300);
	}
		else
		{
			Tyy=221.5;
		}
	
	SONIC=20.047*sqrt( Tyy );

	return SONIC;
}
//求炮兵标准大气条件下马赫数 函数
double CAtmosphere::GetMa_Artillery(double velo, double y)
{
	return velo/GetSONIC_Artillery( y );
}


///////////   美国1976年国家标准大气条件   //////////
//求美国1976年国家标准大气条件下空气密度 函数
double CAtmosphere::Get_rho_USA1976(double y)  //美国1976年国家标准大气条件
{
	double W,T;
	rho0 = 1.225 ;
	y=y/1000;

	if ( ( y>=0 )&&( y<=11.0191) )
	{
		W=1-y/44.3308;
		//T=288.15;
		rho=rho0*pow( W, 4.2559 );
		
	}

	else if ( ( y>11.0191 )&&( y<=20.063 ) )
	{
		W=exp( (14.9647-y)/6.3416 );           //e=2.718281828459;
		T=216.65;
		rho=0.15898*rho0*W ;

	}

		else if ( ( y>20.063  )&&( y<=32.1619 ) )
		{
			W=1+( y- 24.9021)/221.552 ;           
			T=221.552;
			rho=0.032722*rho0*pow( W, -35.1629 ) ;

		}

			else if ( ( y>32.1619  )&&( y<=47.350 ) )
			{
				W=1+( y- 39.7499)/89.4107 ;           
				T=250.350;
				rho=0.0032618*rho0*pow( W, -13.2011 ) ;

			}

				else if ( ( y>47.350 )&&( y<=51.4125 ) )
				{
					W=exp( (48.6252-y)/7.9223 );          
					T=270.650;
					rho=0.0009490*rho0*W ;

				}

					else if ( ( y>51.4125 )&&( y<=71.8020 ) )
					{
						W=1+( y- 39.7499)/89.4107 ;           
						T=250.350;
						rho=0.0032618*rho0*pow( W, 11.2011 ) ;

					}
							
						else if ( ( y>71.8020 )&&( y<=86 ) )
						{
							W=1-( y- 78.0303)/100.2950 ;           
							T=200.590;
							rho=0.000017632*rho0*pow( W, 16.0816 ) ;

						}
							else
							{
							W=exp( (87.2848-y)/5.4700 );          
							T=186.87;
							rho=0.0000036411*rho0*W ;
							}
						
		return rho;
}

//求美国1976年国家标准大气条件下声速 函数
double CAtmosphere::GetSONIC_USA1976(double y)
{
	double W,T;
	y=y/1000;

	if ( ( y>=0 )&&( y<=11.0191) )
	{
		W=1-y/44.3308;
		T=288.15*W;
	}

	else if ( ( y>11.0191 )&&( y<=20.063 ) )
	{
		W=exp( (14.9647-y)/6.3416 );           //e=2.718281828459;
		T=216.65;
	}

		else if ( ( y>20.063  )&&( y<=32.1619 ) )
		{
			W=1+( y- 24.9021)/221.552 ;           
			T=221.552*W;
		}

			else if ( ( y>32.1619  )&&( y<=47.350 ) )
			{
				W=1+( y- 39.7499)/89.4107 ;           
				T=250.350*W;
			}

				else if ( ( y>47.350 )&&( y<=51.4125 ) )
				{
					W=exp( (48.6252-y)/7.9223 );          
					T=270.650;
				}

					else if ( ( y>51.4125 )&&( y<=71.8020 ) )
					{
						W=1+( y- 59.4390)/89.2218 ;           
						T=247.021*W;
					}
							
						else if ( ( y>71.8020 )&&( y<=86 ) )
						{
							W=1-( y- 78.0303)/100.2950 ;           
							T=200.590*W;
						}
							else
							{
							W=exp( (87.2848-y)/5.4700 );          
							T=186.87;
							}
						
		SONIC=20.0468*sqrt( T );

	return SONIC;
}

//求美国1976年国家标准大气条件下马赫数 函数
double CAtmosphere::GetMa_USA1976(double velo, double y)
{
	return velo/GetSONIC_USA1976( y );
}


////////////    求不同地球模型情况下的重力加速度    ////////////
//地球表面为平坦情况下的求g 函数
double CAtmosphere::Get_g_simple( double y )				
{
  g=9.806*(1.0-2.0*y/Rz);

  return g;
}

//考虑地球表面形状 球体 但不考虑地球自转影响 求g函数
double CAtmosphere::Get_g_middle(double phi, double y )     
{
  g=9.78034*( 1+0.00528*sin(phi)*sin(phi)  )*(1.0-2.0*y/Rz);                                

  return g;
}

//考虑地球表面形状和自转运动模型 求g,gr,g_we函数
double CAtmosphere::Get_g_precision( double r, double phi, double& gr, double& g_we )    
{	
	double f,ae,J_2,q;
	
	f=398600500000000;	
	ae=6378140;
	J_2=0.00162395;
	q=0.0034614;
	
	g_we =(-2*f/r/r)*J_2*(ae/r)*(ae/r)*sin(phi);					//地球自转we方向的重力加速度分量	
	gr =(-f/r/r)*(1+J_2*(ae/r)*(ae/r)*(1-5*sin(phi)*sin(phi)) );	//矢径r方向的重力加速度分量
	g= (f/r/r)*(1+J_2*(ae/r)*(ae/r)*(1-3*sin(phi)*sin(phi)) -q*(r/ae)*(r/ae)*(r/ae)*cos(phi)*cos(phi)  );  //地球重力加速度的合成量绝对值

	return g ;
}